package org.example.chatroom.demos.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
public class OnlineUserManager {
//    使用线程安全的hash表来进行用户会话的添加和删除 ;
//     userid 和 用户的websocket连接
    private ConcurrentHashMap<Integer , WebSocketSession> hashMap = new ConcurrentHashMap<>() ;

//    用户上线, 添加用户websocket
     public void online(Integer userId , WebSocketSession session){
//         当用户已经在线 , 则无法登录 ;
//         不记录映射关系, 后续就无法收到消息 ;
         if(hashMap.get(userId) != null){
           log.info("[userId: "+userId +"] 已经在线,无法再次进行登录");
           return;
         }

//         登陆, 记录用户websocket会话 ;
         log.info("[websocket: userId="+ userId +" ]: 登录!");
         hashMap.put(userId , session) ;
     }



//    用户下线或连接出现异常
    public void downLine(Integer userId , WebSocketSession session){
//          和上面添加用户连接同理 , 防止多开
//          , 需要判断 当前要删除的 websocket连接 是否是 当前用户的websocket连接
         WebSocketSession exitSession = hashMap.get(userId) ;
         if(exitSession .equals(session )){
//             是同一个才进行删除
             hashMap.remove(userId) ;
             log.info("[userId: "+userId +"]: "   + " 下线" );
         }

    }


//    根据userid 获取websocketsession

    public WebSocketSession getSession(Integer userId){
         return hashMap.getOrDefault(userId , null);
    }

}
